home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- * *
- * Copyright (c) 1987, David B. Wecker *
- * All Rights Reserved *
- * *
- * This file is part of DBW_Render *
- * *
- * DBW_Render is distributed in the hope that it will be useful, but *
- * WITHOUT ANY WARRANTY. No author or distributor accepts *
- * responsibility to anyone for the consequences of using it or for *
- * whether it serves any particular purpose or works at all, unless *
- * he says so in writing. Refer to the DBW_Render General Public *
- * License for full details. *
- * *
- * Everyone is granted permission to copy, modify and redistribute *
- * DBW_Render, but only under the conditions described in the *
- * DBW_Render General Public License. A copy of this license is *
- * supposed to have been given to you along with DBW_Render so you *
- * can know your rights and responsibilities. It should be in a file *
- * named COPYING. Among other things, the copyright notice and this *
- * notice must be preserved on all copies. *
- ************************************************************************
- * *
- * Authors: *
- * DBW - David B. Wecker *
- * *
- * Versions: *
- * V1.0 870125 DBW - First released version *
- * *
- ************************************************************************/
-
- #define MODULE_MATH
- #include "ray.h"
-
- void veczero(v) /* return the zero vector */
- vector v;
- {
- v[0] = 0.0;
- v[1] = 0.0;
- v[2] = 0.0;
- }
-
- void veccopy(from,to) /* copy vector 'from' into vector 'to' */
- vector from,to;
- {
- to[0] = from[0];
- to[1] = from[1];
- to[2] = from[2];
- }
-
- void vecdump(v,str) /* diagnostic vector printout */
- vector v;
- char *str;
- {
- int i;
-
- printf("%s\t",str);
- for (i = 0; i < 3; i++)
- printf("%15.8f ",v[i]);
- printf("\n");
- }
-
- float hlsvalue(n1,n2,hue)
- float n1,n2,hue;
- {
- while (hue >= 360)
- hue -= 360;
- while (hue < 0)
- hue += 360;
- if (hue < 60)
- return n1 + ((n2 - n1) * hue / 60);
- if (hue < 180)
- return n2;
- if (hue < 240)
- return n1 + ((n2 - n1) * (240 - hue) / 60);
- return n1;
- }
-
- /* see also: macro CV */
- void cv(x,y,z,v) /* convert cartesian position to vector */
- float x,y,z;
- vector v;
- {
- v[0] = x;
- v[1] = y;
- v[2] = z;
- }
-
- void hls(h,l,s,v)
- float h,l,s;
- vector v;
- {
- float m1,m2;
-
- if (s == 0)
- {
- CV(l,l,l,v); /* saturation 0, colorvector luminance only */
- }
- else /* we have color saturation, compute hls */
- {
- m2 = (l <= .5) ? l * (1 + s) : l * (1 - s) + s;
- m1 = 2 * l - m2;
- CV( hlsvalue(m1,m2,h - 120),
- hlsvalue(m1,m2,h),
- hlsvalue(m1,m2,h + 120),
- v);
- }
- }
-
- void vecsub(v1,v2,r) /* vector r = vector 1 - vector 2 */
- vector v1,v2,r;
- {
- r[0] = v1[0] - v2[0];
- r[1] = v1[1] - v2[1];
- r[2] = v1[2] - v2[2];
- }
-
- void vecsum(v1,v2,r) /* vector r = vector 1 + vector 2 */
- vector v1,v2,r;
- {
- r[0] = v1[0] + v2[0];
- r[1] = v1[1] + v2[1];
- r[2] = v1[2] + v2[2];
- }
-
- void vecmul(v1,v2,r) /* vector r = vector 1 * vector 2 */
- vector v1,v2,r;
- {
- r[0] = v1[0] * v2[0];
- r[1] = v1[1] * v2[1];
- r[2] = v1[2] * v2[2];
- }
-
- void vecdiv(v1,v2,r) /* vector r = vector 1 / vector 2 */
- vector v1,v2,r;
- {
- r[0] = v1[0] / v2[0];
- r[1] = v1[1] / v2[1];
- r[2] = v1[2] / v2[2];
- }
-
- void vecscale(s,v,r) /* vector r = vector 1 * scalar */
- float s;
- vector v,r;
- {
- r[0] = s * v[0];
- r[1] = s * v[1];
- r[2] = s * v[2];
- }
-
- /* see also: macro NORM */
- float norm(v) /* scalar = |v| */
- vector v;
- {
- return (float)sqrt((v[0]*v[0]) + (v[1]*v[1]) + (v[2]*v[2]));
- }
-
- void normalize(v) /* return normalized (unit) vector */
- vector v;
- {
- float n;
-
- n = 1.0 / NORM(v);
- vecscale(n,v,v);
- }
-
- float dot(v1,v2)
- vector v1,v2;
- {
- float result;
-
- result = v1[0] * v2[0];
- result += v1[1] * v2[1];
- result += v1[2] * v2[2];
-
- return result;
- }
-
- void cross(v1,v2,r)
- vector v1,v2,r;
- {
- r[0] = (v1[1]*v2[2]) - (v2[1]*v1[2]);
- r[1] = (v1[2]*v2[0]) - (v1[0]*v2[2]);
- r[2] = (v1[0]*v2[1]) - (v2[0]*v1[1]);
- }
-
- void direction(f,t,d) /* return unit direction vector f->t */
- vector f,t,d;
- {
- VECSUB(t,f,d);
- normalize(d);
- }
-
- long curstack() /* return stack position */
- {
- char dummy[5];
- return((long)(dummy));
- }